package com.pp.common.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {

    public static String encryptPassword(String rawPassword) {
        try {
            // 创建加密对象
            MessageDigest digest = MessageDigest.getInstance("md5");

            // 调用加密对象的方法，加密的动作已经完成
            byte[] bytes = digest.digest(rawPassword.getBytes());
            // 接下来，我们要对加密后的结果，进行优化，按照 MySQL 的优化思路走
            // MySQL 的优化思路:
            // 第一步，将数据全部转换成正数: d
            StringBuilder hexString = new StringBuilder();
            for (byte b : bytes) {
                // 第一步，将数据全部转换成正数 =>
                // 解释：为什么采用 b & 255
                /*
                 * b: 它本来是一个 byte 类型的数据 (1 个字节)
                 * 255: 是一个 int 类型的数据 (4 个字节)
                 * byte 类型的数据与 int 类型的数据进行运算，会自动类型提升为 int 类型
                 * eg: b: 1001 1100 (原始数据) 运算时:
                 * b: 0000 0000 0000 0000 0000 0000 1001 1100
                 * 255: 0000 0000 0000 0000 0000 0000 1111 1111
                 * b & 255 的结果: 0000 0000 0000 0000 0000 0000 1001 1100
                 * 此时的 temp 是一个 int 类型的整数
                 */
                int temp = b & 255;

                // 第二步，将所有的数据转换成 16 进制的形式 =>
                // 注意: 转换的时候注意 if 正数 >= 0 && < 16，那么若使用 Integer.toHexString()，
                // 可能会造成缺少位数，因此，需要对 temp 进行判断
                if (temp >= 0 && temp < 16) {
                    // 手动补上一个“0”
                    hexString.append("0").append(Integer.toHexString(temp));
                } else {
                    hexString.append(Integer.toHexString(temp));
                }
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return "";
    }
}
